package fr.generali.accueilclient.gwt.client.ui.components.table.columns;

import com.google.gwt.cell.client.Cell;
import com.google.gwt.cell.client.Cell.Context;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.user.cellview.client.Column;

import fr.generali.accueilclient.gwt.client.common.TypedCommand;
import fr.generali.accueilclient.gwt.client.ui.components.table.HasTooltip;
import fr.generali.accueilclient.gwt.client.ui.components.table.HasTooltipValue;

/**
 * Colonne à l'écoute des évènements de la souris.<br>
 * 
 * @param <T>
 * @param <C>
 */
public class MouseEventAwareColumn<T, C> extends Column<T, C> implements HasTooltipValue<T> {

    private TypedCommand<T> typedCommand;

    protected C value;

    String title;

    protected Cell<C> cell;

    public MouseEventAwareColumn(Cell<C> cell) {
        super(cell);
        this.cell = cell;
    }

    public MouseEventAwareColumn(Cell<C> cell, C value, String title, TypedCommand<T> command) {
        this(cell);
        this.typedCommand = command;
        this.value = value;
        this.title = title;
        this.setFieldUpdater(new FieldUpdater<T, C>() {
            @Override
            public void update(int index, T object, C value) {
                executeCommand(object);
            }
        });
    }

    /**
     * Par défaut on tronque le texte si celui-ci dépasse la largeur de la
     * colonne.<br>
     */
    @Override
    public void render(Context context, T object, SafeHtmlBuilder sb) {

        String html =
                        new StringBuilder()
                                        .append("<div style=\"text-align:center;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\" title=\"")
                                        .append(title).append("\">").toString();

        sb.appendHtmlConstant(html);
        super.render(context, object, sb);
        sb.appendHtmlConstant("</div>");
    }

    /**
     * On écoute les évènements de manière à pouvoir mettre à jour la contenu de
     * la tooltip de la celulle.<br>
     */
    @Override
    public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element elem, T object,
                    com.google.gwt.dom.client.NativeEvent event) {
        super.onBrowserEvent(context, elem, object, event);
        ((HasTooltip<T> ) cell).setTooltipValue(getTooltipValue(object));
    };

    @Override
    public C getValue(T object) {
        return value;
    }

    @Override
    public String getTooltipValue(T value) {
        return title;
    }

    public void setTypedCommand(TypedCommand<T> typedCommand) {
        this.typedCommand = typedCommand;
    }

    protected void executeCommand(T object) {
        MouseEventAwareColumn.this.typedCommand.execute(object);
    }
}
